//发布订阅模式
//发布 emit 订阅 on     {女生失恋:['哭','购物','吃']}

function Girl(){
    this._events = {};
}
Girl.prototype.on = function(eventName,callBack){
    if(this._events[eventName]){
        //也就是女生失恋这个key存在了
        this._events[eventName].push(callBack);//{女生失恋:['哭','购物','吃']}
    }else{
        this._events[eventName] = [callBack];//判断女生失恋(key也就是eventName)是否存在，不存在就把callBack放入一个数组中   {女生失恋:['器']}
    }
};
Girl.prototype.emit = function(eventName,...args){//参数里叫剩余运算符    这个写法就是es6的展开运算符
    // [].slice.call(arguments,1);
    // Array.from(arguments).slice(1);

    //发布
    if(this._events[eventName]){
        //this._events[eventName].forEach(item=>item.apply(this,args));//执行  哭,购物,吃
        this._events[eventName].forEach(item=>item(...args));//使用展开运算符等价于以上    ['我','他']一个一个的展开传入item并执行该方法
    }

};
let girl = new Girl();
let cry = (who,he)=>{console.log(who+'哭'+he)};
let shopping = (who)=>{console.log(who+'购物')};
let eat = (who)=>{console.log(who+'吃')};
girl.on('失恋',cry);//{失恋:[cry]}     这里的cry不能写成cry()具体原因目前不太清楚
girl.on('失恋',shopping);//{失恋:[cry,eat]}
girl.on('失恋',eat);//{失恋:[cry,shopping,eat]}
//girl.emit('失恋','我','他');//发布        如果发布了失恋这个事情，那么就把订阅的事件都执行一遍
girl.emit('失恋','我','他');//参数N个